﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FrbaCommerce.Registro_de_Usuario;
using FrbaCommerce.Modificar_contraseña;

namespace FrbaCommerce.Login
{
    public partial class Login : Form
    {
        public Usuario usuario = new Usuario();
        public FormMainMenu menuPrincipal = new FormMainMenu();
        int intentosLogin = 0;

        public Login()
        {
            InitializeComponent();
        }

        public void main(FormMainMenu menu)
        {
            menuPrincipal = menu;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (!verificarForm()) 
            {
                MessageBox.Show("Por favor ingrese sus datos");
                return;
            }

            if (this.intentosLogin >= 3)
            {
                usuario.inhabilitar();
                this.intentosLogin = 0;
                MessageBox.Show("Su usuario ha sido inhabilitado");
            }

            else if (autenticar())
            {
                mostrarMenuSegunRoles();
            }
        }

       /*
        public void cargarFuncionalidades()
        {
            Rol rol = new Rol();
            rol = rol.buscarRolPorId(this.usuario.id_rol);
            List<Funcionalidad> funciones = new List<Funcionalidad>();
        }
        */

        private void mostrarMenuSegunRoles() 
        {
            DataSet data = new DataSet();
            ConexionSql conexion = new ConexionSql();

            //Roles habilitados
            String query = "SELECT u.rol, r.nombre  FROM (ASDF.Usuario u LEFT JOIN ASDF.Rol r on u.rol = r.id)";
            query += " WHERE r.habilitado=1 and u.username = '" + this.usuario.userName + "'";
            query += " UNION SELECT u.rol, r.nombre FROM (ASDF.Usuario_rol u LEFT JOIN ASDF.Rol r on u.rol = r.id)";
            query += " WHERE r.habilitado = 1 and u.usuario = " + this.usuario.Id + ";";

            data = conexion.ejecutarConsulta(query);

            if (data.Tables[0].Rows.Count > 1)
            {
                SelectRol roles = new SelectRol(data.Tables[0], usuario, this);
                roles.Show();
                this.Hide();
            }

            else if (data.Tables[0].Rows.Count == 0)
            {
                MessageBox.Show("No tiene roles habilitados");
            }

            else
            {
                FormMainMenu main = new FormMainMenu(this.usuario);
                main.Show();
                this.Hide();
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e )
        {
            this.Close();
        }

        private void button1_Click(object sencer, EventArgs e) 
        {
            RegistrarUsuario registrarUsuario = new RegistrarUsuario();
            registrarUsuario.ShowDialog();
        }

        private Boolean verificarForm() 
        {
            return (this.txtUsuario.Text.Length > 0
                    && this.txtPassword.Text.Length > 0);
        }

        /*Validador principal para el login de usuario*/
        private Boolean autenticar()
        {
            //Existe el usuario
            if (!this.usuario.verficarUser(txtUsuario.Text)) 
            {
                MessageBox.Show("Usuario no registrado");
                return false;
            }

            this.usuario.getDatosUsuario(txtUsuario.Text);

            if (!usuario.habilitado)
            {
                MessageBox.Show("Su usuario se encuentra inhabilitado. Para deshabilitarlo consulte a un administrador");
                return false;
            }

            if (verificarPassword())
            {
                intentosLogin = 0;
 
                if (usuario.solicitarCambioPassword()) 
                {
                    ModificarContrasenia cambiarContrasenia = new ModificarContrasenia(this.usuario, this.Text); 
                    cambiarContrasenia.ShowDialog();
                    if (!cambiarContrasenia.getPasswordModificado()) 
                    {
                        MessageBox.Show("Debe cambiar su password");
                        return false;
                    }
                }
                
                usuario.updateUltimoLogin();
                return true;
            }
            else if (usuario.habilitado)
            {
                intentosLogin++;
                MessageBox.Show("Contraseña incorrecta");
            }

            return false;
          }

        private Boolean verificarPassword()
        {
            CodigoHash hash = new CodigoHash();
            return (hash.CheckHash(txtPassword.Text, usuario.password));
        }
        
    }
}
